package plp.orientadaObjetos2.util;

import plp.orientadaObjetos1.excecao.declaracao.ClasseNaoDeclaradaException;
import plp.orientadaObjetos1.expressao.leftExpression.Id;
import plp.orientadaObjetos1.memoria.AmbienteCompilacaoOO1;
import plp.orientadaObjetos1.util.Tipo;
import plp.orientadaObjetos1.util.TipoClasse;
import plp.orientadaObjetos2.memoria.AmbienteCompilacaoOO2;

public class SuperClasseUtil {
	
	public static boolean isClasseOrSuperclasse(AmbienteCompilacaoOO1 ambiente, Tipo tpClasseRef, Tipo tpClasseValor) throws ClasseNaoDeclaradaException{
		AmbienteCompilacaoOO2 ambienteOO2 = (AmbienteCompilacaoOO2)ambiente;
		
		if (tpClasseRef.equals(tpClasseValor))//essa verificacao serve pra qualquer tipo, seja classe seja primitivo
			return true;
		
		SuperClasseMap superClasseMap = ambienteOO2.getSuperClasse(tpClasseValor.getTipo());
		TipoClasse idClasseValorMae = superClasseMap == null? null : new TipoClasse((Id)superClasseMap.getSuperClasse());
		
		if (idClasseValorMae != null)
			return isClasseOrSuperclasse(ambiente, tpClasseRef, idClasseValorMae);
		
		return false;
	}

}
